Deliver cpufreq actual average freq to libxc interface
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 20 Mar 2009 08:48:57 +0000 (08:48 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 20 Mar 2009 08:48:57 +0000 (08:48 +0000)
Calculate cpu actual average freq according to aperf and mperf MSR and
then deliver to libxc interface

Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>
tools/libxc/xc_pm.c
tools/libxc/xenctrl.h
xen/drivers/acpi/pmstat.c
xen/include/public/sysctl.h

index 951c22c5c9aca06663798a5bf8f953584b9311ff..918c60401086110545709feba7025659b9177cf4 100644 (file)
@@ -307,6 +307,24 @@ int xc_set_cpufreq_para(int xc_handle, int cpuid,
     return xc_sysctl(xc_handle, &sysctl);
 }
 
+int xc_get_cpufreq_avgfreq(int xc_handle, int cpuid, int *avg_freq)
+{
+    int ret = 0;
+    DECLARE_SYSCTL;
+
+    if ( (xc_handle < 0) || (!avg_freq) )
+        return -EINVAL;
+
+    sysctl.cmd = XEN_SYSCTL_pm_op;
+    sysctl.u.pm_op.cmd = GET_CPUFREQ_AVGFREQ;
+    sysctl.u.pm_op.cpuid = cpuid;
+    ret = xc_sysctl(xc_handle, &sysctl);
+
+    *avg_freq = sysctl.u.pm_op.get_avgfreq;
+
+    return ret;
+}
+
 int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info)
 {
     int rc;
index bc2e25095b61058a0a4fdf5f32e254d0e77cc2d5..4a30c68fe47699b94d3f865f72c36723c32caaf1 100644 (file)
@@ -1242,6 +1242,7 @@ int xc_get_cpufreq_para(int xc_handle, int cpuid,
 int xc_set_cpufreq_gov(int xc_handle, int cpuid, char *govname);
 int xc_set_cpufreq_para(int xc_handle, int cpuid,
                         int ctrl_type, int ctrl_value);
+int xc_get_cpufreq_avgfreq(int xc_handle, int cpuid, int *avg_freq);
 
 struct xc_get_cputopo {
      /* IN: maximum addressable entry in
index bf476d584d82d033b00304d5254f5db5fdfc128e..76e91a4288128f4502a6c918c6d9b4b9a83c009c 100644 (file)
@@ -409,6 +409,16 @@ static int set_cpufreq_para(struct xen_sysctl_pm_op *op)
     return ret;
 }
 
+static int get_cpufreq_avgfreq(struct xen_sysctl_pm_op *op)
+{
+    if ( !op || !cpu_online(op->cpuid) )
+        return -EINVAL;
+
+    op->get_avgfreq = cpufreq_driver_getavg(op->cpuid, USR_GETAVG);
+
+    return 0;
+}
+
 static int get_cputopo (struct xen_sysctl_pm_op *op)
 {
     uint32_t i, nr_cpus;
@@ -494,6 +504,12 @@ int do_pm_op(struct xen_sysctl_pm_op *op)
         break;
     }
 
+    case GET_CPUFREQ_AVGFREQ:
+    {
+        ret = get_cpufreq_avgfreq(op);
+        break;
+    }
+
     case XEN_SYSCTL_pm_op_get_cputopo:
     {
         ret = get_cputopo(op);
index fe9f4b56115c5ee5938f8b3234bcbe788746aae1..2c0c5dcc33a18aae755c8952f5a1931fa6ae61cc 100644 (file)
@@ -376,6 +376,7 @@ struct xen_sysctl_pm_op {
     #define GET_CPUFREQ_PARA           (CPUFREQ_PARA | 0x01)
     #define SET_CPUFREQ_GOV            (CPUFREQ_PARA | 0x02)
     #define SET_CPUFREQ_PARA           (CPUFREQ_PARA | 0x03)
+    #define GET_CPUFREQ_AVGFREQ        (CPUFREQ_PARA | 0x04)
 
     /* get CPU topology */
     #define XEN_SYSCTL_pm_op_get_cputopo  0x20
@@ -386,6 +387,7 @@ struct xen_sysctl_pm_op {
         struct xen_get_cpufreq_para get_para;
         struct xen_set_cpufreq_gov  set_gov;
         struct xen_set_cpufreq_para set_para;
+        uint64_t get_avgfreq;
         struct xen_get_cputopo      get_topo;
     };
 };